# -*- coding: utf-8 -*-

import re
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

"""
目标网站: https://juejin.cn/
需求: 获取50个左右的文章，保存到txt文档当中
翻页是滚轮华东，加载元素，加载50个左右的元素

1. 初始化方法
2. 解析文章
3. 滑动
4. 保存
5. 主方法
"""
class Juejin:
    # 初始化方法
    def __init__(self):
        # 实例化驱动对象
        self.driver = webdriver.Chrome()
        # 最大化窗口
        self.driver.maximize_window()
        # 加载网站
        self.driver.get('https://juejin.cn/')

    # 解析文章
    def parse_html(self):
        time.sleep(1)
        # 数据列表，循环获取
        lis = self.driver.find_elements(By.XPATH, '//div[@class="entry-list list"]/li')
        # print(lis)
        for li in lis:
            try:
                # 点击，进入详情页
                li.click()
                # 切换窗口，定位数据
                self.driver.switch_to.window(self.driver.window_handles[-1])
                time.sleep(2)
                # 获取数据，网页标题作为文件标题命名
                title = self.driver.find_element(By.CLASS_NAME, 'article-title').text
                # 特殊符号
                title = re.sub(r'[:?"./\\()<>]', '', title)
                # 内容,获取了所有的p标签
                contents = self.driver.find_elements(By.XPATH, '//div[@class="article-viewer markdown-body result"]/p')
                if contents:
                    s = ''
                    for p in contents:
                        # 循环一次，获取一个p标签的元素
                        # p.text：获取p标签的文本内容，内容结尾加了一个换行符
                        s += p.text + '\n'
                else:
                    contents = self.driver.find_elements(By.XPATH, '//div[@class="article-viewer markdown-body cache result"]/p')
                    s = ''
                    for p in contents:
                        # 循环一次，获取一个p标签的元素
                        # p.text：获取p标签的文本内容，内容结尾加了一个换行符
                        s += p.text + '\n'

                # 保存文章
                self.save_data(title, s)
                # 如果只有一个窗口， 不关闭，两个窗口关闭当前窗口
                if len(self.driver.window_handles) > 1:
                    # 关闭当前窗口， close
                    self.driver.close()
                # 切换到第一个窗口
                self.driver.switch_to.window(self.driver.window_handles[0])
            except Exception as e:
                print(e)
                print('没有文章内容')


    # 滑动
    def slide(self, height):
        # print(height)
        # 页面的滑动
        self.driver.execute_script(
            f'window.scrollTo(0, {height});'
        )

    # 保存
    def save_data(self, title, content):
        with open(f'掘金/{title}.txt', 'w', encoding='utf-8')as f:
            f.write(content)

    # 主方法
    def main(self):
        # 获取整个窗口的高度，获取的是高跟宽，是字典类型
        heights = self.driver.get_window_size()['height']
        print(heights)
        # 滚轮滑动5次
        page = 1
        while page <= 5:
            self.slide(heights)
            heights += heights  # heights = heights + heights
            page = page + 1
            time.sleep(0.5)
        # 解析，加载出所有的元素，进行解析
        self.parse_html()


# 实例化对象.类名()
# 边点击，边获取，边滑动 // 一次性滑动完了，获取所有的元素，依次点击
j = Juejin()
j.main()
